package com.manage.platform.utils;

import com.manage.platform.vo.MenuTreeVo;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 组织树形结构工具类
 */
public class TreeListMenuUtil {

    /**
     * 构建树形结构
     * @param list 所有组织节点列表
     * @return 树形结构列表
     */
    public static List<MenuTreeVo> buildMenuTreeList(List<MenuTreeVo> list) {
        // 使用Map缓存提高查找效率
        Map<Long, MenuTreeVo> nodeMap = list.stream()
                .collect(Collectors.toMap(MenuTreeVo::getId, node -> node));

        List<MenuTreeVo> rootNodes = new ArrayList<>();

        // 构建父子关系
        for (MenuTreeVo node : list) {
            Long parentId = node.getPid();
            if (parentId == null || parentId.equals(0L)) {
                rootNodes.add(node);
            } else {
                MenuTreeVo parent = nodeMap.get(parentId);
                if (parent != null) {
                    if (parent.getChildren() == null) {
                        parent.setChildren(new ArrayList<>());
                    }
                    parent.getChildren().add(node);
                }
            }
        }
        return rootNodes;
    }

    /**
     * 递归构建树形结构（备选方案）
     * @param list 所有组织节点列表
     * @return 树形结构列表
     */
    public static List<MenuTreeVo> buildMenuTreeListRecursive(List<MenuTreeVo> list) {
        List<MenuTreeVo> treeList = new ArrayList<>();
        // 查找所有根节点
        List<MenuTreeVo> rootNodes = list.stream()
                .filter(node -> node.getPid() == null || node.getPid().equals(0L))
                .collect(Collectors.toList());

        // 为每个根节点构建子树
        for (MenuTreeVo root : rootNodes) {
            MenuTreeVo rootTree = findChildren(root, list);
            treeList.add(rootTree);
        }
        return treeList;
    }

    /**
     * 递归查找子节点
     * @param parentNode 父节点
     * @param list 所有节点列表
     * @return 带子节点的父节点
     */
    private static MenuTreeVo findChildren(MenuTreeVo parentNode, List<MenuTreeVo> list) {
        List<MenuTreeVo> children = new ArrayList<>();

        // 查找直接子节点
        for (MenuTreeVo node : list) {
            if (parentNode.getId().equals(node.getPid())) {
                // 递归构建子树
                MenuTreeVo childNode = findChildren(node, list);
                children.add(childNode);
            }
        }

        if (!children.isEmpty()) {
            parentNode.setChildren(children);
        }
        return parentNode;
    }
}
